home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK1.toast / Development Kits (Disc 1) / QuickTime / Programming Stuff / Documentation / develop articles / develop Issue 23 / Internet Config / IC 1.1 / ICAppSourceKit1.1 / ICInstall.p < prev    next >
Encoding:
Text File  |  1995-04-23  |  9.1 KB  |  361 lines  |  [TEXT/PJMM]

  1. unit ICInstall;
  2.  
  3. interface
  4.  
  5.     procedure AdjustInstalMenu (menu: integer);
  6.     procedure DoInstallMenu (menu, item: integer);
  7.     function InitializeComponentInstallation: OSErr;
  8.  
  9. implementation
  10.  
  11.     uses
  12.         Folders, Components, 
  13.  
  14.         ICTypes, ICCAPI, 
  15.  
  16.         ICMiscSubs, ICGlobals, ICStandardFile, ICDialogs, ICSubs, ICAPI;
  17.  
  18.     const            (* why aren't these in Components.p??? *)
  19.         registerCmpGlobal = 1;
  20.         registerCmpNoDuplicates = 2;
  21.         registerCompAfter = 4;
  22.  
  23.     var
  24.         application_version: longInt;
  25.         installed_version: longInt;
  26.  
  27.     function GetVersionFromResFile: longInt;
  28.         var
  29.             versh: VersRecHndl;
  30.     begin
  31.         GetVersionFromResFile := 0;
  32.         versh := VersRecHndl(Get1Resource('vers', 1));
  33.         if versh <> nil then begin
  34.             GetVersionFromResFile := versh^^.numericVersion.version;
  35.         end; (* if *)
  36.     end;
  37.  
  38.     function GetRegisteredVersion: longInt;
  39.         var
  40.             inst: ComponentInstance;
  41.             junk: OSErr;
  42.             refnum: integer;
  43.     begin
  44.         GetRegisteredVersion := 0;
  45.         if has_components then begin
  46.             inst := OpenDefaultComponent(internetConfigurationComponentType, internetConfigurationComponentSubType);
  47.             if inst <> nil then begin
  48.                 refnum := OpenComponentResFile(Component(inst));
  49.                 if refnum <> -1 then begin
  50.                     GetRegisteredVersion := GetVersionFromResFile;
  51.                     CloseResFile(refnum);
  52.                 end;
  53.                 junk := CloseComponent(inst);
  54.             end; (* if *)
  55.         end; (* if *)
  56.     end;
  57.  
  58.     function IsInstalled (var where: FSSpec): boolean;
  59.         var
  60.             err: OSErr;
  61.             ndx: integer;
  62.             found: boolean;
  63.             cpb: CInfoPBRec;
  64.             info: FInfo;
  65.     begin
  66.         err := FindFolder(kOnSystemDisk, kExtensionFolderType, true, where.vRefNum, where.parID);
  67.         where.name := GetAString(128, 12);
  68.         if err = noErr then begin
  69.             err := HGetFInfo(where.vRefNum, where.parID, where.name, info);
  70.             if err <> noErr then begin
  71.                 found := false;
  72.                 ndx := 1;
  73.                 repeat
  74.                     with cpb do begin
  75.                         ioNamePtr := @where.name;
  76.                         ioVRefNum := where.vRefNum;
  77.                         ioDirID := where.parID;
  78.                         ioFDirIndex := ndx;
  79.                     end; (* with *)
  80.                     err := PBGetCatInfoSync(@cpb);
  81.                     if err = noErr then begin
  82.                         found := (cpb.ioFlFndrInfo.fdType = 'thng') and (cpb.ioFlFndrInfo.fdCreator = ICcreator);
  83.                     end; (* if *)
  84.                     ndx := ndx + 1;
  85.                 until found or (err <> noErr);
  86.                 if not found then begin
  87.                     where.name := GetAString(128, 12);
  88.                     err := fnfErr;
  89.                 end; (* if *)
  90.             end; (* if *)
  91.         end; (* if *)
  92.         IsInstalled := (err = noErr);
  93.     end; (* IsInstalled *)
  94.  
  95.     procedure UpdateInstalledVersion (var fss: FSSpec);
  96.         var
  97.             ref: integer;
  98.             err: OSErr;
  99.     begin
  100.         installed_version := 0;
  101.         if IsInstalled(fss) then begin
  102.             ref := HOpenResFile(fss.vRefNum, fss.parID, fss.name, fsRdPerm);
  103.             err := ResError;
  104.             if err = noErr then begin
  105.                 installed_version := GetVersionFromResFile;
  106.                 CloseResFile(ref);
  107.             end; (* if *)
  108.         end;
  109.     end;
  110.  
  111.     function SaveComponentToFile (fss: FSSpec): OSErr;
  112.         var
  113.             err: OSErr;
  114.             thng: Handle;
  115.             rref: integer;
  116.             junk: OSErr;
  117.     begin
  118.         err := noErr;
  119.         thng := GetResource('ThNg', 128);
  120.         if thng = nil then begin
  121.             err := resNotFound;
  122.         end; (* if *)
  123.         if err = noErr then begin
  124.             HNoPurge(thng);
  125.             junk := HCreate(fss.vRefNum, fss.parID, fss.name, ICcreator, 'thng');
  126.             err := HOpenRF(fss.vRefNum, fss.parID, fss.name, fsRdWrPerm, rref);
  127.             if err = noErr then begin
  128.                 err := SetEOF(rref, GetHandleSize(thng));
  129.                 if err = noErr then begin
  130.                     err := FSWriteQ(rref, GetHandleSize(thng), thng^);
  131.                 end; (* if *)
  132.                 junk := FSClose(rref);
  133.             end; (* if *)
  134.             HPurge(thng);
  135.         end; (* if *)
  136.         UpdateInstalledVersion(fss); { in case we are installing or saving to the init }
  137.         SaveComponentToFile := err;
  138.     end; (* SaveComponentToFile *)
  139.  
  140.     function RegisterFile (fss: FSSpec): OSErr;
  141.         var
  142.             ref: integer;
  143.             err, err2, junk: OSErr;
  144.             result: longint;
  145.     begin
  146.         ref := HOpenResFile(fss.vRefNum, fss.parID, fss.name, fsRdPerm);
  147.         err := ResError;
  148.         if err = noErr then begin
  149.             result := RegisterComponentResourceFile(ref, registerCmpGlobal);
  150.             if result > 0 then begin
  151.                 err := noErr;
  152.             end
  153.             else begin
  154.                 err := result;
  155.             end; (* if *)
  156.             CloseResFile(ref);
  157.             err2 := ResError;
  158.             if err = noErr then begin
  159.                 err := err2;
  160.             end; (* if *)
  161.         end; (* if *)
  162.         RegisterFile := err;
  163.     end; (* RegisterFile *)
  164.  
  165.     function SaveICComponent: OSErr;
  166.         var
  167.             junklong: longint;
  168.             err: OSErr;
  169.             fss: FSSpec;
  170.     begin
  171.         err := ICStandardPutFile(GetAString(128, 13), GetAString(128, 12), fss);
  172.         if err = noErr then begin
  173.             err := SaveComponentToFile(fss);
  174.         end;
  175.         SaveICComponent := err;
  176.     end; (* SaveICComponent *)
  177.  
  178.     function JustInstallICComponent: OSErr;
  179.         var
  180.             err: OSErr;
  181.             where: FSSpec;
  182.     begin
  183.         UpdateInstalledVersion(where);
  184.         err := SaveComponentToFile(where);
  185.         if err = noErr then begin
  186.             if has_components then begin
  187.                 err := RegisterFile(where);
  188.             end;
  189.         end; (* if *)
  190.         JustInstallICComponent := err;
  191.     end;
  192.  
  193.     function InstallICComponent: OSErr;
  194.         var
  195.             err: OSErr;
  196.             where: FSSpec;
  197.             prompt: Str255;
  198.             desc: Str255;
  199.             ndx: integer;
  200.             junk: integer;
  201.             registered_version: longInt;
  202.     begin
  203.         err := noErr;
  204.         registered_version := 0;
  205.         UpdateInstalledVersion(where);
  206.         if (installed_version > 0) then begin
  207.             if installed_version < application_version then begin
  208.                 prompt := GetAString(128, 17);
  209.             end
  210.             else if installed_version < application_version then begin
  211.                 prompt := GetAString(128, 18);
  212.             end
  213.             else if installed_version = application_version then begin
  214.                 prompt := GetAString(128, 19);
  215.             end; (* if *)
  216.             ParamText(prompt, '', '', '');
  217.             InitCursor;
  218.             if CautionAlert(145, @CancelModalFilter) <> ok then begin
  219.                 err := userCanceledErr;
  220.             end; (* if *)
  221.         end; (* if *)
  222.         if err = noErr then begin
  223.             err := JustInstallICComponent;
  224.         end; (* if *)
  225.         if err = noErr then begin
  226.             InitCursor;
  227.             ParamText(GetAString(128, 20), '', '', '');
  228.             junk := NoteAlert(142, nil);
  229.         end; (* if *)
  230.         InstallICComponent := err;
  231.     end; (* InstallICComponent *)
  232.  
  233.     function RemoveICComponent: OSErr;
  234.         var
  235.             err: OSErr;
  236.             fss: FSSpec;
  237.             junk: integer;
  238.     begin
  239.         err := noErr;
  240.         UpdateInstalledVersion(fss);
  241.         if installed_version > 0 then begin
  242.             err := HDelete(fss.vRefNum, fss.parID, fss.name);
  243.         end;
  244.         if err = noErr then begin
  245.             if GetRegisteredVersion > 0 then begin
  246.                 junk := NoteAlert(144, nil);
  247.             end;
  248.         end;
  249.         UpdateInstalledVersion(fss);
  250.         RemoveICComponent := err;
  251.     end;
  252.  
  253.     procedure AdjustInstalMenu (menu: integer);
  254.         var
  255.             fss: FSSpec;
  256.     begin
  257.         if has_components then begin
  258.             SetItemEnable(GetMHandle(menu), IM_Install, installed_version <> application_version);
  259.         end
  260.         else begin
  261.             SetItemEnable(GetMHandle(menu), IM_Install, false);
  262.         end;
  263.         SetItemEnable(GetMHandle(menu), IM_Remove, installed_version > 0);
  264.     end;
  265.  
  266.     procedure DoInstallMenu (menu, item: integer);
  267.     begin
  268.         case item of
  269.             IM_Install: 
  270.                 DisplayError(acInstallComponent, InstallICComponent);
  271.             IM_Save: 
  272.                 DisplayError(acInstallComponent, SaveICComponent);
  273.             IM_Remove: 
  274.                 DisplayError(acRemoveComponent, RemoveICComponent);
  275.             otherwise
  276.                 ;
  277.         end; (* case *)
  278.     end;
  279.  
  280.     function CheckICUsageVersion: OSErr;
  281.         var
  282.             err, err2: OSErr;
  283.             inst: ICInstance;
  284.             component_instance: ComponentInstance;
  285.     begin
  286.         err := ICMapErr(ICStart(inst, ICcreator));
  287.         if err = noErr then begin
  288.             err := ICMapErr(ICGetComponentInstance(inst, component_instance));
  289.             if err = noErr then begin
  290.                 if BAND(GetComponentVersion(component_instance), $FFFF0000) < BAND(internetConfigurationComponentInterfaceVersion, $FFFF0000) then begin
  291.                     err := unimpErr;
  292.                 end;
  293.             end
  294.             else begin
  295.                 err := noErr; { we work fine without a component, we just can't deal with an old component }
  296.             end;
  297.             err2 := ICMapErr(ICStop(inst));
  298.             if err = noErr then begin
  299.                 err := err2;
  300.             end;
  301.         end;
  302.         CheckICUsageVersion := err;
  303.     end;
  304.  
  305.     function InitializeComponentInstallation: OSErr;
  306.         var
  307.             fss: FSSpec;
  308.             a: integer;
  309.             err, err2: OSErr;
  310.             inst: ICInstance;
  311.             component_instance: ComponentInstance;
  312.     begin
  313.         err := noErr;
  314.         application_version := app_version.numericVersion.version;
  315.         UpdateInstalledVersion(fss);
  316.         if has_components then begin
  317.             if installed_version < application_version then begin
  318.                 InitCursor;
  319.                 if installed_version > 0 then begin
  320.                     a := NoteAlert(146, @CancelModalFilter);
  321.                     if a <> ok then begin
  322.                         err := userCanceledErr;
  323.                     end;
  324.                 end
  325.                 else begin
  326.                     ParamText(GetAString(128, 8), '', '', '');
  327.                     a := NoteAlert(141, @CancelModalFilter);
  328.                 end;
  329.                 if a = ok then begin
  330.                     err := JustInstallICComponent;
  331.                     DisplayError(acInstallComponent, err);
  332.                     if err = noErr then begin
  333.                         err := CheckICUsageVersion;
  334.                         if err = noErr then begin
  335.                             InitCursor;
  336.                             ParamText(GetAString(128, 20), '', '', '');
  337.                             a := NoteAlert(142, nil);
  338.                         end
  339.                         else begin
  340.                             InitCursor;
  341.                             ParamText(GetAString(128, 26), '', '', '');
  342.                             a := NoteAlert(142, nil);
  343.                             err := userCanceledErr;
  344.                         end;
  345.                     end;
  346.                 end;
  347.             end;
  348.         end;
  349. { Ensure invariant that we are using the glue, or we are using the current version of the component }
  350.         if err = noErr then begin
  351.             err := CheckICUsageVersion;
  352.         end;
  353.         InitializeComponentInstallation := err;
  354.     end;
  355.  
  356. end. (* ICInstall *)
  357. temp_instance: ComponentInstance;
  358. temp_instance := OpenDefaultComponent(internetConfigurationComponentType, internetConfigurationComponentSubType);
  359. if temp_instance <> nil then begin
  360.     junk := CloseComponent(temp_instance);
  361. end;